package cn.iocoder.yudao.module.erp.service.gi;

import cn.iocoder.yudao.module.erp.controller.admin.dp.dpwlmq.vo.DpWlmqSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.dpitem.DpItemWlmqDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.giitem.GiItemWlmqDO;
import cn.iocoder.yudao.module.erp.dal.mysql.giitem.GiItemWlmqMapper;
import cn.iocoder.yudao.module.erp.service.dp.DpWlmqServiceImpl;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.module.erp.controller.admin.gi.giwlmq.vo.*;
import cn.iocoder.yudao.module.erp.dal.dataobject.gi.GiWlmqDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.dal.mysql.gi.GiWlmqMapper;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.GI_INCOUNT_NOT_ZERO;

/**
 * ERP物流乌鲁木齐仓库 Service 实现类
 * @author 天使管理员
 */

@Service
@Validated
public class GiWlmqServiceImpl implements GiWlmqService {

    @Resource
    private GiWlmqMapper giWlmqMapper;
    @Resource
    private GiItemWlmqMapper giItemWlmqMapper;
    @Resource
    private AdminUserService userService;
    @Autowired
    private DpWlmqServiceImpl dpWlmqServiceImlp;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public String createGiWlmq(GiWlmqSaveReqVO createReqVO) {
        Integer inCount = createReqVO.getInCount();
        if (inCount == null || inCount == 0) {
            throw exception(GI_INCOUNT_NOT_ZERO);
        }
        String maxId = generateOrderNumber();
        createReqVO.setId(maxId);
        // 插入
        GiWlmqDO giWlmq = BeanUtils.toBean(createReqVO, GiWlmqDO.class);
        giWlmqMapper.insert(giWlmq);
        // 插入子表
        createGiItemWlmqList(maxId, createReqVO.getGiItemWlmqs());
        // 返回
        return maxId;
    }

    public String generateOrderNumber() {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        // 格式化为 yyyyMMdd
        String dateStr = currentDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        // 获取当前最大单号的前8位和最后四位
        String currentMaxOrderStr = getCurrentMaxOrderNumber();
        // 如果数据库中没有订单，则从 "0001" 开始
        if (currentMaxOrderStr == null) {
            return "WLMQ" + dateStr + "0001";
        }
        // 获取当前最大单号的日期部分
        String currentMaxDateStr = currentMaxOrderStr.substring(4, 12);
        // 如果日期不一致，重置序列为0001
        int sequence;
        if (currentMaxDateStr.equals(dateStr)) {
            // 取最后四位的序号，并递增
            sequence = Integer.parseInt(currentMaxOrderStr.substring(12)) + 1;
        } else {
            // 日期不一致，则重置序列为 0001
            sequence = 1;
        }
        // 生成新的单号
        return "WLMQ" + dateStr + String.format("%04d", sequence);
    }

    // 从数据库中获取当前最大单号
    private String getCurrentMaxOrderNumber() {
        // 此处应从数据库查询获取当前最大单号
        return giWlmqMapper.getCurrentMaxOrderNumber();
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateGiWlmq(GiWlmqSaveReqVO updateReqVO) {
        // 更新
        GiWlmqDO updateObj = BeanUtils.toBean(updateReqVO, GiWlmqDO.class);
        giWlmqMapper.updateById(updateObj);
        // 获得用户信息
        AdminUserDO user = userService.getUser(getLoginUserId());
        updateObj.setUpdater(user.getUsername());
        giWlmqMapper.updateById(updateObj);
        // 更新子表
        updateGiItemWlmqList(updateReqVO.getId(), updateReqVO.getGiItemWlmqs());
    }

    @Override
    public void deleteGiWlmq(String id) {
        // 删除子表
        deleteGiItemWlmqByNo(id);
        // 删除
        giWlmqMapper.deleteById(id);
    }

    @Override
    public GiWlmqDO getGiWlmq(String id) {
        return giWlmqMapper.selectById(id);
    }

    @Override
    public PageResult<GiWlmqDO> getGiWlmqPage(GiWlmqPageReqVO pageReqVO) {
        return giWlmqMapper.selectPage(pageReqVO);
    }

    @Override
    public List<GiItemWlmqDO> getGiItemWlmqListByNo(String no) {
        return giItemWlmqMapper.selectListByNo(no);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void examineGiWlmq(GiWlmqDO giWlmqDO) {
        // 将 GiWlmqSaveReqVO 转换为 DpWlmqSaveReqVO,处理并保存插入到 DpWlmqSaveReqVO 对应的表
        convertGiWlmqToDpWlmq(giWlmqDO);
        giWlmqMapper.updateById(giWlmqDO);
    }

    private void updateGiItemWlmqList(String no, List<GiItemWlmqDO> list) {
        if (list == null || list.size() == 0){
            return;
        }
        deleteGiItemWlmqByNo(no);
        list.forEach(o -> o.setNo(null)); // 解决更新情况下：1）id 冲突；2）updateTime 不更新
        createGiItemWlmqList(no, list);
    }

    private void createGiItemWlmqList(String no, List<GiItemWlmqDO> list) {
        if (list == null || list.size() == 0){
            return;
        }
        list.forEach(o -> o.setNo(no));
        giItemWlmqMapper.insertBatch(list);
    }

    private void deleteGiItemWlmqByNo(String no) {
        giItemWlmqMapper.deleteByNo(no);
    }

    public void convertGiWlmqToDpWlmq(GiWlmqDO giWlmqDO){
        GiWlmqDO giWlmq = giWlmqMapper.selectById(giWlmqDO.getId());
        List<GiItemWlmqDO> giItemWlmqDOList = giItemWlmqMapper.selectListByNo(giWlmqDO.getId());
        //复制 GiWlmqsaveReqV0 中的属性到 DpWlmqSaveReqVo
        DpWlmqSaveReqVO createReqVO = BeanUtils.toBean(giWlmq, DpWlmqSaveReqVO.class);
        //设置剩余总件数
        createReqVO.setRemCount(giWlmq.getInCount());
        //设置剩余总体积
        createReqVO.setRemVolume(giWlmq.getInVolume());
        //设置剩余总重量
        createReqVO.setRemWeight(giWlmq.getWeight());
        List<DpItemWlmqDO> dpItemWlmqList = BeanUtils.toBean(giItemWlmqDOList,DpItemWlmqDO.class);
        //设置转换后的列表到 DpWlmqSaveReqV0
        createReqVO.setDpItemWlmqs(dpItemWlmqList);
        dpWlmqServiceImlp.createDpWlmq(createReqVO);
    }

}